#!/usr/bin/python3
# -*- coding:utf-8 -*-
# @Author    : jltxseo
# @File      : blog_tags.py
# @Time      : 2018/1/27 1:46
# @Software  : PyCharm

from django import template
from ..models import Post, Category, Tag
from django.db.models.aggregates import Count
"""
自定义的模板标签代码
"""

# 导入 template 这个模块，然后实例化了一个 template.Library 类
register = template.Library()


# 可以在模板中使用语法 {% get_recent_posts %} 调用这个函数了。
@register.simple_tag
def get_recent_posts(num=5):
    return Post.objects.all()[:num]


"""
列表中的元素为每一篇文章（Post）的创建时间，且是 Python 的 date 对象，精确到月份，降序排列。接受的三个参数值表明了这些含义，
一个是 created_time ，即 Post 的创建时间，month 是精度，order='DESC' 表明降序排列（即离当前越近的时间越排在前面）。
例如我们写了 3 篇文章，分别发布于 2017 年 2 月 21 日、2017 年 3 月 25 日、2017 年 3 月 28 日，那么 dates 函数将返回
 2017 年 3 月 和 2017 年 2 月这样一个时间列表，且降序排列，从而帮助我们实现按月归档的目的。
"""


@register.simple_tag
def archives():
    return Post.objects.dates('created_time', 'month', order='DESC')


"""
这个 Category.objects.annotate 方法和 Category.objects.all 有点类似，
它会返回数据库中全部 Category 的记录，但同时它还会做一些额外的事情，
在这里我们希望它做的额外事情就是去统计返回的 Category 记录的集合中每条记录下的文章数。
代码中的 Count 方法为我们做了这个事，它接收一个和 Categoty 相关联的模型参数名（这里是 Post，通过 ForeignKey 关联的），
然后它便会统计 Category 记录的集合中每条记录下的与之关联的 Post 记录的行数，也就是文章数，最后把这个值保存到 num_posts 属性
"""


@register.simple_tag
def get_categories():
    # 记得在顶部引入 count 函数
    # Count 计算分类下的文章数，其接受的参数为需要计数的模型的名称
    return Category.objects.annotate(num_posts=Count('post')).filter(num_posts__gt=0)


@register.simple_tag
def get_post_from_category(category):
    post_list = Post.objects.filter(category=category)
    return post_list


@register.simple_tag
def get_tags():
    # 记得在顶部引入 Tag model
    return Tag.objects.annotate(num_posts=Count('post')).filter(num_posts__gt=0)
